"""
日志管理模块
提供统一的日志记录功能
"""

import os
import sys
from pathlib import Path
from datetime import datetime
from loguru import logger
from typing import Optional


class Logger:
    """
    日志管理类
    
    功能：
    - 统一的日志输出格式
    - 支持控制台和文件输出
    - 日志级别控制
    - 日志文件自动轮转
    """
    
    def __init__(self, 
                 name: str = "PlateRecognition",
                 log_path: str = "logs/",
                 log_level: str = "INFO",
                 rotation: str = "1 day",
                 retention: str = "7 days"):
        """
        初始化日志管理器
        
        参数:
            name (str): 日志名称
            log_path (str): 日志文件保存路径
            log_level (str): 日志级别 (DEBUG, INFO, WARNING, ERROR)
            rotation (str): 日志轮转策略
            retention (str): 日志保留时间
        """
        self.name = name
        self.log_path = Path(log_path)
        self.log_level = log_level
        
        # 创建日志目录
        self.log_path.mkdir(parents=True, exist_ok=True)
        
        # 移除默认的处理器
        logger.remove()
        
        # 添加控制台输出
        logger.add(
            sys.stdout,
            format=self._get_format(),
            level=log_level,
            colorize=True
        )
        
        # 添加文件输出
        log_file = self.log_path / f"{name}_{datetime.now().strftime('%Y%m%d')}.log"
        logger.add(
            log_file,
            format=self._get_format(),
            level=log_level,
            rotation=rotation,
            retention=retention,
            encoding="utf-8"
        )
        
        self.logger = logger
        
    def _get_format(self) -> str:
        """
        获取日志格式
        
        返回:
            str: 日志格式字符串
        """
        return (
            "<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</green> | "
            "<level>{level: <8}</level> | "
            "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
            "<level>{message}</level>"
        )
        
    def debug(self, message: str, *args, **kwargs):
        """记录调试信息"""
        self.logger.debug(message, *args, **kwargs)
        
    def info(self, message: str, *args, **kwargs):
        """记录一般信息"""
        self.logger.info(message, *args, **kwargs)
        
    def warning(self, message: str, *args, **kwargs):
        """记录警告信息"""
        self.logger.warning(message, *args, **kwargs)
        
    def error(self, message: str, *args, **kwargs):
        """记录错误信息"""
        self.logger.error(message, *args, **kwargs)
        
    def critical(self, message: str, *args, **kwargs):
        """记录严重错误信息"""
        self.logger.critical(message, *args, **kwargs)
        
    def exception(self, message: str, *args, **kwargs):
        """记录异常信息（包含堆栈跟踪）"""
        self.logger.exception(message, *args, **kwargs)
        
    def success(self, message: str, *args, **kwargs):
        """记录成功信息"""
        self.logger.success(message, *args, **kwargs)
        
    @staticmethod
    def get_logger(name: Optional[str] = None) -> 'Logger':
        """
        获取日志实例（单例模式）
        
        参数:
            name (str, optional): 日志名称
            
        返回:
            Logger: 日志实例
        """
        if not hasattr(Logger, '_instance'):
            Logger._instance = Logger(name or "PlateRecognition")
        return Logger._instance


# 创建全局日志实例
log = Logger.get_logger() 